package intranet.server;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;




import intranet.client.TemplatesTabFunc;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.PageSize;
import com.lowagie.text.html.simpleparser.HTMLWorker;
import com.lowagie.text.pdf.PdfWriter;

/**
 * @author Robin TROADEC
 * Le coté serveur de templateTab.
 */

@SuppressWarnings("serial")
public class TemplatesTabFuncImpl extends RemoteServiceServlet implements
		TemplatesTabFunc {
	
	private String filePath;
	

	/**
	 * Fonction permettant de sauver un document pdf à partir d'un String HTML
	 * @param fileName - le nom du fichier
	 * @param textHtml - le text HTML
	 * @param date - Le timestamp de la date
	 * @param user - Le nom de l'utilisateur
	 */
	public String toPdf (String fileName, String textHtml,long date, String user) 
	{
		String ret="";
		filePath=getServletContext().getRealPath("..");
		isfolderDoc();
		File file = new File(filePath+"/Documents/"+date+user+fileName+".pdf");
		try
		{
		Document document = new Document(PageSize.A4,36, 72, 108, 180);
		if (file.exists())
		{
		System.out.println("Fichier delete");
			file.delete();
		}
		PdfWriter.getInstance(document, new FileOutputStream(file));
		document.open();
		document.addAuthor(user);
		document.addCreator(user);
		document.addCreationDate();
		document.addTitle(fileName);
		
		//Parser le string
		HTMLWorker htmlWorker = new HTMLWorker(document);

		
		htmlWorker.parse(new StringReader(textHtml));

		

/*
		 ArrayList objects = HTMLWorker.parseToList(new StringReader(textHtml), styles);
		 for (int k = 0; k < objects.size(); ++k)
		 {
             Element e = (Element) objects.get(k);
             System.out.println("nb : "+k +"  "+objects.get(k).toString());
             System.out.println("nb : "+k +"  "+objects.get(k).getClass().toString());
             
             if (e instanceof Image) 
                 document.add( Image.getInstance((Image)objects.get(k)));
			else
				document.add((Element) objects.get(k));
         }

*/

		
		document.close();
		System.out.println("Fichier créer");
		return date+user+fileName+".pdf";

		} catch(DocumentException e) {
		e.printStackTrace();
		} catch (FileNotFoundException e) {
		e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
		e.printStackTrace();
		} catch (IOException e) {
		e.printStackTrace();
		}
		return ret;
	}
	
	/**
	 * Fonction permettant de creer le dossier template s'il n'existe pas
	 */
	public void isfolder()
	{
		filePath=getServletContext().getRealPath("..");
		File dir = new File(filePath+"/Templates");
		
		if (!dir.exists())
		{
			dir.mkdir();	
		}
	}
	
	/**
	 * Fonction permettant de creer le dossier documents s'il n'existe pas
	 */
	public void isfolderDoc()
	{
		filePath=getServletContext().getRealPath("..");
		File dir = new File(filePath+"/Documents");
		
		if (!dir.exists())
		{
			dir.mkdir();	
		}
	}

	/**
	 * Fonction permettant de sauver un document html à partir d'un String HTML
	 * @param fileName - le nom du fichier
	 * @param textHtml - le text HTML
	 * @param date - Le timestamp de la date
	 * @param user - Le nom de l'utilisateur
	 */
	public String saveDoc(String name, String textHtml, long date, String user) 
	{
		filePath=getServletContext().getRealPath("..");
		isfolder();
		
		File f = new File(filePath+"/Templates/"+date+user+name+".html");

		if (!f.exists())
		{
			try
			{
				f.createNewFile();
			} catch (IOException e)
			{
				e.printStackTrace();
			}
		}
			
		try
		{
			FileWriter fw = new FileWriter(f, true);	
			BufferedWriter output = new BufferedWriter(fw);		
			output.write(textHtml);
			output.flush();
			output.close();
			System.out.println("fichier créé");
		}
		catch(IOException ioe)
		{
			System.out.print("Erreur : ");
			ioe.printStackTrace();
		}
		return date+user+name+".html";	
	}

	/**
	 * Fonction permettant de supprimer le template donné en paramètre
	 * @param path - Le nom du fichier
	 */
	public Boolean delete(String path)
	{
		filePath=getServletContext().getRealPath("..");
		File f = new File(filePath+"/Templates/"+path);
		System.out.println(filePath+"/Templates/"+path);
		System.out.println(f.exists()+"");
		if ( f.exists())
		{
			f.delete();
			return true;
		}
		return false;
	}
	
	/**
	 * Fonction permettant de supprimer le document pdf donné en paramètre
	 * @param path - Le nom du fichier
	 */
	public Boolean deletePdf(String path)
	{
		filePath=getServletContext().getRealPath("..");
		File f = new File(filePath+"/Documents/"+path);
		System.out.println(filePath+"/Documents/"+path);
		System.out.println(f.exists()+"");
		if ( f.exists())
		{
			f.delete();
			return true;
		}
		return false;
	}

	/**
	 * Fonction permettant de charger le template donné en paramètre
	 * @param path - Le nom du fichier
	 */
	public String load(String path)
	{
		filePath=getServletContext().getRealPath("..");
		String ret="";
		File f = new File(filePath+"/Templates/"+path);
		if (f.exists())
		{
			BufferedReader buffR = null;
		    String ligne;

		    try
		    {
		    	buffR = new BufferedReader (new FileReader(f));
		    	while ((ligne = buffR.readLine()) != null)
		    		ret+=ligne+"\n";
		    	buffR.close();
		    }
		    catch(FileNotFoundException exc)
		    {
		    	exc.printStackTrace();
		    } catch (IOException e)
			{
				e.printStackTrace();
			}	    
		}
		else
		{
			System.out.println("po trouvé le chemin");
		}
		return ret;
	}	
}
